package com.pet.serve.service;

import com.pet.serve.entity.Goods;
import com.pet.serve.repository.GoodsRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;


import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class GoodsService {

    // 使用 @Autowired 进行依赖注入，确保 Repository 不是静态的
    @Autowired
    private static GoodsRepository goodsRepository;


    public GoodsService(GoodsRepository goodsRepository) {
        this.goodsRepository = goodsRepository;
    }


    // 查询所有商品，带分页
    public Page<Goods> getAllGoods(Pageable pageable) {
        return goodsRepository.findAll(pageable);
    }

    // 根据价格区间查询商品
    public Page<Goods> getGoodsByPriceRange(BigDecimal minPrice, BigDecimal maxPrice, Pageable pageable) {
        return goodsRepository.findByPriceBetween(minPrice, maxPrice, pageable);
    }

    // 根据名称模糊查询商品
    public Page<Goods> searchGoodsByName(String name, Pageable pageable) {
        return goodsRepository.findByNameContaining(name, pageable);
    }

    // 根据类型查询商品
    public Page<Goods> getGoodsByType(String type, Pageable pageable) {
        return goodsRepository.findByType(type, pageable);
    }

    // 获取用户收藏的商品列表
    public Page<Goods> getFavoriteGoodsByUsername(String username, Pageable pageable) {
        return goodsRepository.findFavoriteGoodsByUsername(username, pageable);
    }

    // 批量删除商品
    public void deleteGoods(List<Long> goodIds) {
        goodsRepository.deleteByGoodidIn(goodIds);
    }

    // 更新商品状态
    public void updateGoodsStatus(Long goodid, String status) {
        goodsRepository.updateGoodsStatus(goodid, status);
    }

    // 自定义查询方法 - 按名称、类型和状态搜索商品
    public List<Goods> searchGoods(String name, String type, String status) {
        return goodsRepository.searchGoods(name, type, status);
    }

    // 检查库存
    public boolean checkNum(Long goodid, Integer num) {
        return goodsRepository.checkNum(goodid, num);
    }

    /**
     * 导入商品数据
     *
     * @param file Excel 文件
     * @return 导入的商品列表
     * @throws IOException 文件读取异常
     */
    public List<Goods> importGoods(MultipartFile file) throws IOException {
        List<Goods> goodsList = new ArrayList<>();

        // 读取 Excel 文件
        Workbook workbook = WorkbookFactory.create(file.getInputStream());
        Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

        for (Row row : sheet) {
            // 跳过表头
            if (row.getRowNum() == 0) {
                continue;
            }
            Goods goods = new Goods();
            goods.setName(row.getCell(0).getStringCellValue()); // 商品名称
            goods.setType(row.getCell(1).getStringCellValue()); // 商品种类
            goods.setPrice(row.getCell(2).getNumericCellValue()); // 商品价格
            goods.setNum((int) row.getCell(3).getNumericCellValue()); // 商品库存
            goods.setStatus("soldout"); // 默认下架状态
            // 可以根据需要解析更多列
            goodsList.add(goods);
        }

        workbook.close();
        return goodsRepository.saveAll(goodsList); // 保存导入的商品数据
    }


    public List<Goods> getAllGoods() {
        return goodsRepository.findAll();
    }

    // 获取推荐商品的方法
    public static List<Goods> getRecommendedGoods() {
        // 假设只推荐“上架”的商品
        return goodsRepository.findTop10ByStatusOrderByCreateTimeDesc("saling");
    }

    public Page<Goods> getGoodsByStatus(String status, Pageable pageable) {
        return goodsRepository.findByStatus(status, pageable);
    }

    public boolean deleteGoodsById(Long goodsId) {
        goodsRepository.deleteById(goodsId);
        return true;
    }

    public Goods addGoods(Goods goods) {
        // 设置创建和更新时间
        goods.setCreateTime(new Date());
        goods.setUpdateTime(new Date());
        return goodsRepository.save(goods);
    }

}

